package com.hedl.practice.diyJava.data.zoned_date_time.test;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        /**
         * LocalDateTime总是表示本地日期和时间，要表示一个带时区的日期和时间，我们就需要ZonedDateTime。
         */
        ZonedDateTime zdt = ZonedDateTime.now();        //默认时区
        ZonedDateTime zdt1 = ZonedDateTime.now(ZoneId.of("America/New_York"));      //自定义时区
        System.out.println("默认时区"+zdt);
        System.out.println("纽约时区："+zdt1);

        System.out.println("===========================================================================");
        /**
         * 另一种方式是通过给一个LocalDateTime附加一个ZoneId，就可以变成ZonedDateTime：
         */
        LocalDateTime ldt = LocalDateTime.of(2019,4,23,21,32,44);
        ZonedDateTime zdt2 = ldt.atZone(ZoneId.systemDefault());
        ZonedDateTime zdt3 = ldt.atZone(ZoneId.of("America/New_York"));
        System.out.println("转换成默认的本地时区：+"+zdt2);
        System.out.println("转换成纽约时区："+zdt3);

        System.out.println("============================时区转换=========================================");
        /**
         * 需要有一个ZonedDateTime对象，然后，通过withZoneSameInstant()将关联时区转换到另一个时区，转换后日期和时间都会相应调整。
         */
        //获取本地时区
        ZonedDateTime zdt4 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        //转为纽约时区
        ZonedDateTime zdt5 = zdt4.withZoneSameInstant(ZoneId.of("America/New_York"));
        System.out.println("本地时区的时间："+zdt4);
        System.out.println("本地时区转换成纽约时区："+zdt5);

        System.out.println("=======================时区转换为本地时间============================");
        /**
         * 注意，时区转换的时候，由于夏令时的存在，不同的日期转换的结果很可能是不同的
         *   涉及到时区时，千万不要自己计算时差，否则难以正确处理夏令时。
         */
        ZonedDateTime zdt6 = ZonedDateTime.now(ZoneId.of("America/New_York"));
        LocalDateTime ldt1 = zdt6.toLocalDateTime();
        System.out.println("纽约时区，现在的时间："+zdt6);
        System.out.println("转为本地化时间："+ldt1);    //转换为LocalDateTime时，直接丢弃了时区信息。

    }
}
